توابعی که ISkinned<Fruit> را می پذیرند, فقط ISkinned<Fruit> را میپذیرند
تا حالا به کلمات in و out که تو بعضی جنریکها هست دقت کردید؟ اصن چه معنی دارن و اگر نباشن چه فرقی میکنن؟
کد زیر رو در نظر بگیرید
class Fruit {}
class Banana : Fruit {}
interface ICovariantSkinned<out T> {}
interface ISkinned<T> {}
و حالا توابع زیر
void Peel(ISkinned<Fruit> skinned) { }
void Peel(ICovariantSkinned<Fruit> skinned) { }
تابعی که ICovariantSkinned<Fruit> را می پذیرد می تواند ICovariantSkinned<Fruit> یا ICovariantSkinned<Banana> را بپذیرد زیرا ICovariantSkinned<T> یک رابط کوواریانت و Banana یک نوع Fruit است.
توابعی که ISkinned<Fruit> را می پذیرند, فقط ISkinned<Fruit> را میپذیرند